iT邦幫忙

2023 iThome 鐵人賽

DAY 23
0

有了 docker-compose.yml 之後我們還有一些待辦事項,接著在 /airflow 建立 Dockerfile

Dockerfile

FROM apache/airflow:2.2.4-python3.9

USER root

# Install required packages
RUN apt-get update && \
    apt-get install -y vim && \
    apt-get install -y libpq-dev && \
    apt-get clean

USER airflow

COPY requirements.txt .
# Install additional Python packages
RUN pip install --upgrade pip && \
    pip install --no-cache-dir -r requirements.txt

requirement.txt

提供 Airflow image 所需要的套件

pymongo
python-dotenv
pycryptodome==3.18.0
rich==13.4.2
tw_invoice==2023.9.6

初始化 Airflow

Airflow 在第一次啟動的時候比必須做 airflow db init 和初始化管理員帳號,但我實在不太想要每次都記這些指令。因此設計一個 shell script 來做事,就是到 airflow 容器裡幫我做初始化和建立管理者帳號

(若沒有建立管理者帳號,登入 Airflow 還是不能使用,因為一開始就會請你輸入帳密)

export AIRFLOW_HOME="$(pwd)"
IS_INITDB=True
AIRFLOW_USER=admin
AIRFLOW_PASSWORD=admin
AIRFLOW_USER_EMAIL=test@gmail.com

if [ $IS_INITDB ]; then

  echo "Initializing Airflow DB setup and Admin user setup because value of IS_INITDB is $IS_INITDB"
  echo " Airflow admin username will be $AIRFLOW_USER"

  docker exec -ti airflow_webserver airflow db init && echo "Initialized airflow DB"
  docker exec -ti airflow_webserver airflow users create --role Admin --username $AIRFLOW_USER --password $AIRFLOW_PASSWORD -e $AIRFLOW_USER_EMAIL -f airflow -l airflow && echo "Created airflow Initial admin user with username $AIRFLOW_USER"

else
  echo "Skipping InitDB and InitUser setup because value of IS_INITDB is $IS_INITDB"
fi

而這個步驟基本上只要做一次,為什麼呢?

可以發現昨天的 docker-compose.yml 有 volume

所以即使你刪除容器資料也不會消失 (真的想刪除的話可以刪除 volume 就會不見了)

volumes:
  postgres_data:

建立我的 Airflow

可以依照以下的指令執行

  1. 起服務 docker-compose up -d
  2. (一次性)進入 Postgres 容器 docker exec -it postgres psql -U postgres
  3. (一次性)手動建立 Schema CREATE DATABASE invoice;
  4. 再起一次服務 docker-compose up -d (因為 airflow_webserver、airflow_scheduler 可能因為沒有 Postgres 先掛掉了)

上一篇
Day 22:如何用 docker 架設 Airflow - 1
下一篇
Day 24:設計 MongoDB Dao
系列文
透過 python 建立發票系統 - 自己的發票自己查30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言